home *** CD-ROM | disk | FTP | other *** search
/ Aminet 38 / Aminet 38 (2000)(Schatztruhe)[!][Aug 2000].iso / Aminet / util / moni / Scout-src.lha / src / objects / scout_screenmode.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-03-09  |  15.5 KB  |  388 lines

  1. /**
  2.  * Scout - The Amiga System Monitor
  3.  *
  4.  *------------------------------------------------------------------
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  * You must not use this source code to gain profit of any kind!
  21.  *
  22.  *------------------------------------------------------------------
  23.  *
  24.  * @author Andreas Gelhausen
  25.  * @author Richard Körber <rkoerber@gmx.de>
  26.  */
  27.  
  28.  
  29.  
  30. #include "scout_screenmode.h"
  31.  
  32. extern struct ExecBase  *SysBase;
  33.  
  34. int  smodecnt;
  35.  
  36. APTR smodemoretext0,smodemoretext1,smodemoretext2,smodemoretext3,smodemoretext4,smodemoretext5;
  37. APTR smodemoretext6,smodemoretext7,smodemoretext8,smodemoretext9,smodemoretext10,smodemoretext11;
  38. APTR smodemoretext12,smodemoretext13,smodemoretext14,smodemoretext15,smodemoretext16,smodemoretext17;
  39. APTR smodemoretext18,smodemoretext19,smodemoretext20;
  40.  
  41. struct Remember *SModeRememberKey;
  42.  
  43. __asm LONG smodelist_dspfunc(register __a2 char **array, register __a1 struct SModeEntry *smodeentry, register __a0 struct Hook *hook) {
  44.    if (smodeentry) {
  45.       *array++ = smodeentry->sme_id;
  46.       *array++ = smodeentry->sme_width;
  47.       *array++ = smodeentry->sme_height;
  48.       *array++ = smodeentry->sme_depth;
  49.       *array   = smodeentry->sme_name;
  50.    } else {
  51.       *array++ = ESC "bModeID";
  52.       *array++ = ESC "bWidth";
  53.       *array++ = ESC "bHeight";
  54.       *array++ = ESC "bDepth";
  55.       *array   = ESC "bScreenMode";
  56.    }
  57.    return (0);
  58. }
  59.  
  60. struct Hook smodelist_dsphook = {
  61.  {NULL, NULL},
  62.  (ULONG (* )())smodelist_dspfunc,
  63.  NULL, NULL
  64. };
  65.  
  66. void FreeSMode (void) {
  67.    MyFreeStructs (&SModeRememberKey, smodetext, smodelist);
  68. }
  69.  
  70. void GetSModeEntry (struct SModeEntry *smentry, ULONG id) {
  71.  
  72.    struct NameInfo idname;
  73.    struct DimensionInfo iddim;
  74.  
  75.    if (! smentry->sme_smodeid) {
  76.       smentry->sme_smodeid = id;
  77.       sprintf (smentry->sme_id, "$%08lx", id);
  78.    }
  79.  
  80.    GetDisplayInfoData(NULL,(UBYTE *)&iddim,sizeof(struct DimensionInfo),DTAG_DIMS,id);
  81.    sprintf (smentry->sme_width,  "%5ld" ,iddim.Nominal.MaxX-iddim.Nominal.MinX+1);
  82.    sprintf (smentry->sme_height, "%5ld" ,iddim.Nominal.MaxY-iddim.Nominal.MinY+1);
  83.    sprintf (smentry->sme_depth,  "%5ld" ,(iddim.MaxDepth==32 ? 24 : iddim.MaxDepth));
  84.  
  85.    if(GetDisplayInfoData(NULL,(UBYTE *)&idname,sizeof(struct NameInfo),DTAG_NAME,id)) {
  86.       strncpy (smentry->sme_name,idname.Name,DISPLAYNAMELEN);
  87.    } else {
  88.       struct MonitorInfo idmon;
  89.       struct DisplayInfo iddisp;
  90.  
  91.       if(GetDisplayInfoData(NULL,(UBYTE *)&idmon,sizeof(struct MonitorInfo),DTAG_MNTR,id)) {
  92.          if(GetDisplayInfoData(NULL,(UBYTE *)&iddisp,sizeof(struct DisplayInfo),DTAG_DISP,id)) {
  93.             ULONG  prop = iddisp.PropertyFlags;
  94.             WORD   xres = iddim.Nominal.MaxX - iddim.Nominal.MinX;
  95.             STRPTR namebuf = smentry->sme_name;
  96.  
  97.             //? if(idmon.Mspc) ...
  98.  
  99.             NameCopy(namebuf,idmon.Mspc->ms_Node.xln_Name);
  100.             if(namebuf[0]=='E') {
  101.               if(!strcmp(namebuf,"EURO72:")) strcpy(namebuf,"EURO:72Hz ");
  102.               if(!strcmp(namebuf,"EURO36:")) strcpy(namebuf,"EURO:36Hz ");
  103.             }
  104.  
  105.                  if(xres > 1200) strcat(namebuf,"SuperHighRes");
  106.             else if(xres > 600)  strcat(namebuf,"HighRes");
  107.             else if(xres > 300)  strcat(namebuf,"LowRes");
  108.             else                 strcat(namebuf,"ExtraLowRes");
  109.  
  110.             if(prop&DIPF_IS_DUALPF        ) {
  111.                strcat(namebuf," DualPF"   );
  112.                if(prop&DIPF_IS_PF2PRI) strcat(namebuf,"2");
  113.             }
  114.             if(prop&DIPF_IS_HAM           ) strcat(namebuf," HAM"      );
  115.             if(prop&DIPF_IS_EXTRAHALFBRITE) strcat(namebuf," EHB"      );
  116.             if(prop&DIPF_IS_LACE          ) strcat(namebuf," Interlace");
  117.             if(prop&DIPF_IS_SCANDBL       ) strcat(namebuf," DblScan"  );
  118.  
  119.          } else {
  120.             strncpy (smentry->sme_name,idmon.Mspc->ms_Node.xln_Name,DISPLAYNAMELEN);
  121.          }
  122.       } else {
  123.          strcpy(smentry->sme_name," < ??? >");
  124.       }
  125.    }
  126. }
  127.  
  128. int GetSMode (struct SModeEntry **first) {
  129.    struct  SModeEntry   *smentry,*previous = NULL;
  130.  
  131.    int smcnt = 0;
  132.    *first = 0;
  133.  
  134.    if (clientstate) {
  135.       if (SendDaemon ("GetSModeList")) {
  136.          while ((smentry = AllocRemember (&SModeRememberKey, sizeof (struct SModeEntry), MEMF_ANY|MEMF_CLEAR)) \
  137.            && (ReceiveDecodedEntry ((UBYTE *) smentry, sizeof (struct SModeEntry)))) {
  138.             IsHex (smentry->sme_id, (LONG *)&smentry->sme_smodeid);
  139.  
  140.             if (! *first)
  141.                *first = smentry;
  142.             if (previous)
  143.                previous->sme_next = smentry;
  144.  
  145.             smcnt++;
  146.             previous = smentry;
  147.          }
  148.       }
  149.    } else {
  150.       ULONG currid = INVALID_ID;
  151.  
  152.       while((currid=NextDisplayInfo(currid)) != INVALID_ID)
  153.       {
  154.          if(smentry = AllocRemember (&SModeRememberKey, sizeof(struct SModeEntry), MEMF_ANY|MEMF_CLEAR)) {
  155.             GetSModeEntry(smentry,currid);
  156.  
  157.             if (! *first)
  158.                *first = smentry;
  159.             if (previous)
  160.                previous->sme_next = smentry;
  161.  
  162.             smcnt++;
  163.             previous = smentry;
  164.          }
  165.       }
  166.    }
  167.    return (smcnt);
  168. }
  169.  
  170. void PrintSMode (char *filename) {
  171.    int   i=1;
  172.    BPTR  handle;
  173.    struct SModeEntry *entryp;
  174.  
  175.    handle = HandlePrintStart (filename);
  176.    if ((handle) && (PrintOneLine (handle, "\n  ModeID    Wdth  Hght  Dpth  ScreenMode\n\n"))) {
  177.       if (! WI_SMode) {
  178.          i = GetSMode (&entryp);
  179.       }
  180.       if (i) {
  181.          for (i=0;;i++) {
  182.             if (WI_SMode)
  183.                DoMethod (smodelist,MUIM_List_GetEntry,i,&entryp);
  184.             if (!entryp) break;
  185.  
  186.             sprintf (tmpstr2, " %ls %5ls %5ls %2ls  %ls\n", entryp->sme_id, entryp->sme_width, entryp->sme_height, entryp->sme_depth, entryp->sme_name);
  187.             if (! (PrintOneLine (handle, tmpstr2)))
  188.                break;
  189.  
  190.             if (! WI_SMode)
  191.                entryp = entryp->sme_next;
  192.          }
  193.       }
  194.    }
  195.    HandlePrintStop();
  196. }
  197.  
  198. void ShowSMode (void) {
  199.    struct   SModeEntry   *sm;
  200.  
  201.    ApplicationSleep();
  202.    set(smodelist,MUIA_List_Quiet,TRUE);
  203.    set(smodelist,MUIA_List_CompareHook,smodelist_cmphook_ptr);
  204.    set(BT_SModeMore, MUIA_Disabled, TRUE);
  205.    FreeSMode();
  206.  
  207.    smodecnt = GetSMode (&sm);
  208.  
  209.    while (sm) {
  210.       InsertSortedEntry (smodelist, (APTR *) &sm);
  211.       sm = sm->sme_next;
  212.    }
  213.  
  214.    SetCountText (smodecount, smodecnt);
  215.    AwakeApplication();
  216.    set(smodelist,MUIA_List_Quiet,FALSE);
  217. }
  218.  
  219. void SendSModeList (void) {
  220.    struct   SModeEntry   *sm;
  221.  
  222.    FreeSMode();
  223.    GetSMode (&sm);
  224.  
  225.    while (sm) {
  226.       SendEncodedEntry ((UBYTE *) sm, sizeof (struct SModeEntry));
  227.       sm = sm->sme_next;
  228.    }
  229.    FreeSMode();
  230. }
  231.  
  232. void GetSModeMore (struct SModeEntry *sm) {
  233.    unsigned char     *title = "SCREENMODE: ";
  234.    struct   WinFree  *ptr;
  235.    ULONG    id = sm->sme_smodeid;
  236.    struct   DisplayInfo   iddisp;
  237.    struct   DimensionInfo iddims;
  238.    struct   MonitorInfo   idmntr;
  239.    struct   NameInfo      idname;
  240.  
  241.    GetDisplayInfoData(NULL,(UBYTE *)&iddisp,sizeof(struct DisplayInfo)  ,DTAG_DISP,id);
  242.    GetDisplayInfoData(NULL,(UBYTE *)&iddims,sizeof(struct DimensionInfo),DTAG_DIMS,id);
  243.    GetDisplayInfoData(NULL,(UBYTE *)&idmntr,sizeof(struct MonitorInfo)  ,DTAG_MNTR,id);
  244.  
  245.    if (ptr = AllocWinFree()) {
  246.       ptr->wf_Window = (APTR) WindowObject,
  247.       MUIA_Window_SizeGadget, TRUE,
  248.       MUIA_HelpNode, ScreenModeText,
  249.       MUIA_Window_ID, MakeDetailID('.','S','M','D'),
  250.       WindowContents, VGroup,
  251.          Child, ColGroup(2),
  252.             Child, MyLabel2 ("Name:"),
  253.             Child, smodemoretext0 = MyTextObject(),
  254.             Child, MyLabel2 ("Monitor:"),
  255.             Child, smodemoretext6 = MyTextObject(),
  256.             Child, MyLabel2 ("Compatibility:"),
  257.             Child, HGroup,
  258.                Child, smodemoretext16 = MyTextObject2(),
  259.                Child, MyLabel2 ("="),
  260.                Child, smodemoretext17 = MyTextObject(),
  261.             End,
  262.          End,
  263.          Child, HGroup,
  264.             Child, VGroup,
  265.                Child, MyLabel2 ("ModeID:\nPreferred:"),
  266.                Child, MyLabel2 ("Property:"),
  267.                Child, MyLabel2 ("NotAvail:"),
  268.                Child, MyLabel2 ("PixelSpeed:\nTicks/Pixel:"),
  269.                Child, MyLabel2 ("StdSprites:\nTicks/Pixel:"),
  270.                Child, MyLabel2 ("Palette:\nRGB bits:"),
  271.                Child, MyLabel2 ("MouseTicks:"),
  272.             End,
  273.             Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 0,
  274.                Child, smodemoretext15 = MyTextObject(),
  275.                Child, smodemoretext1  = KeyButtonF ('l', iddisp.PropertyFlags),
  276.                Child, smodemoretext2  = KeyButtonF ('w', iddisp.NotAvailable),
  277.                Child, smodemoretext3  = MyTextObject(),
  278.                Child, smodemoretext4  = MyTextObject(),
  279.                Child, smodemoretext5  = MyTextObject(),
  280.                Child, smodemoretext20 = MyTextObject(),
  281.             End,
  282.             Child, HSpace(0),
  283.             Child, VGroup,
  284.                Child, MyLabel2 ("MinRaster:\nMaxRaster:"),
  285.                Child, MyLabel2 ("Nominal:\nOffset:"),
  286.                Child, MyLabel2 ("TxtOScan:\nOffset:"),
  287.                Child, MyLabel2 ("StdOScan:\nOffset:"),
  288.                Child, MyLabel2 ("MaxOScan:\nOffset:"),
  289.                Child, MyLabel2 ("VideoOScan:\nOffset:"),
  290.             End,
  291.             Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 0,
  292.                Child, smodemoretext8  = MyTextObject(),
  293.                Child, smodemoretext9  = MyTextObject(),
  294.                Child, smodemoretext11 = MyTextObject(),
  295.                Child, smodemoretext10 = MyTextObject(),
  296.                Child, smodemoretext13 = MyTextObject(),
  297.                Child, smodemoretext12 = MyTextObject(),
  298.             End,
  299.             Child, HSpace(0),
  300.             Child, VGroup,
  301.                Child, MyLabel2 ("Depth:\nColors:"),
  302.                Child, MyLabel2 ("H freq.:\nV freq.:"),
  303.                Child, MyLabel2 ("TotalRows:\nColorClocks:\n=\nMinRow:"),
  304.                Child, MyLabel2 ("ViewPosition:\nDefault VP:\nViewResolution:\nVP Range min:\nmax:"),
  305.             End,
  306.             Child, VGroup, MUIA_Group_SameWidth, TRUE, MUIA_Weight, 0,
  307.                Child, smodemoretext19 = MyTextObject(),
  308.                Child, smodemoretext18 = MyTextObject(),
  309.                Child, smodemoretext7  = MyTextObject(),
  310.                Child, smodemoretext14 = MyTextObject(),
  311.             End,
  312.          End,
  313.       End, End;
  314.  
  315.       if (ptr->wf_Window) {
  316.          char   colors[20];
  317.          ULONG  fh, fv;
  318.          STRPTR compathelp;
  319.          UWORD  dep  = iddims.MaxDepth;
  320.          ULONG  prop = iddisp.PropertyFlags;
  321.          ULONG  tcc  = idmntr.TotalColorClocks*280;
  322.  
  323.          if(GetDisplayInfoData(NULL,(UBYTE *)&idname,sizeof(struct NameInfo),DTAG_NAME,id)) {
  324.             MySetContents (smodemoretext0, "%s", idname.Name);
  325.          } else {
  326.             MySetContents (smodemoretext0, ESC "8%s", sm->sme_name);
  327.          }
  328.          MySetContents(smodemoretext6,"$%08lx \"%s\" (OpenCnt=%d)", idmntr.Mspc, idmntr.Mspc->ms_Node.xln_Name, (WORD)idmntr.Mspc->ms_OpenCount);
  329.  
  330.          HandleFlagsButtonPressed(smodemoretext1, ptr, "(SCREENMODE)", "PropertyFlags", prop                , (struct LongFlag *)&dip_flags    , NULL, 'l');
  331.          HandleFlagsButtonPressed(smodemoretext2, ptr, "(SCREENMODE)", "NotAvailable",  iddisp.NotAvailable , (struct LongFlag *)&diavail_flags, NULL, 'w');
  332.  
  333.          fv = 1000000L / (idmntr.TotalColorClocks * 28);
  334.          fh = (fv * 100) / idmntr.TotalRows;
  335.  
  336.          if(prop&DIPF_IS_DUALPF) {
  337.             sprintf(colors,"2x%d",1<<(dep>>1));
  338.          } else if(prop&DIPF_IS_HAM) {
  339.             sprintf(colors,"[%d]",1<<(3*(dep-2)));
  340.          } else if(dep>24) {
  341.             strcpy(colors,"> 16.8M");
  342.          } else {
  343.             sprintf(colors,"%d",1<<dep);
  344.          }
  345.  
  346.          MySetContents(smodemoretext3, ESC "r%d ns\n%d x %d", iddisp.PixelSpeed, iddisp.Resolution.x, iddisp.Resolution.y);
  347.          MySetContents(smodemoretext4, ESC "r%d\n%d x %d", iddisp.NumStdSprites, iddisp.SpriteResolution.x, iddisp.SpriteResolution.y);
  348.          MySetContents(smodemoretext5, ESC "r%d\n%d:%d:%d", iddisp.PaletteRange, iddisp.RedBits, iddisp.GreenBits, iddisp.BlueBits);
  349.          MySetContents(smodemoretext7, ESC "r%d\n%d\n%d.%03d µs\n%d", idmntr.TotalRows, idmntr.TotalColorClocks, tcc/1000, tcc%1000, idmntr.MinRow);
  350.          MySetContents(smodemoretext8, ESC "c%5d x %5d\n%5d x %5d", iddims.MinRasterWidth, iddims.MinRasterHeight, iddims.MaxRasterWidth, iddims.MaxRasterHeight);
  351.          MySetContents(smodemoretext9, ESC "c%4d x %4d\n%4d x %4d", iddims.Nominal.MaxX-iddims.Nominal.MinX+1, iddims.Nominal.MaxY-iddims.Nominal.MinY+1, iddims.Nominal.MinX, iddims.Nominal.MinY);
  352.          MySetContents(smodemoretext10, ESC "c%4d x %4d\n%4d x %4d", iddims.StdOScan.MaxX-iddims.StdOScan.MinX+1, iddims.StdOScan.MaxY-iddims.StdOScan.MinY+1, iddims.StdOScan.MinX, iddims.StdOScan.MinY);
  353.          MySetContents(smodemoretext11, ESC "c%4d x %4d\n%4d x %4d", iddims.TxtOScan.MaxX-iddims.TxtOScan.MinX+1, iddims.TxtOScan.MaxY-iddims.TxtOScan.MinY+1, iddims.TxtOScan.MinX, iddims.TxtOScan.MinY);
  354.          MySetContents(smodemoretext12, ESC "c%4d x %4d\n%4d x %4d", iddims.VideoOScan.MaxX-iddims.VideoOScan.MinX+1, iddims.VideoOScan.MaxY-iddims.VideoOScan.MinY+1, iddims.VideoOScan.MinX, iddims.VideoOScan.MinY);
  355.          MySetContents(smodemoretext13, ESC "c%4d x %4d\n%4d x %4d", iddims.MaxOScan.MaxX-iddims.MaxOScan.MinX+1, iddims.MaxOScan.MaxY-iddims.MaxOScan.MinY+1, iddims.MaxOScan.MinX, iddims.MaxOScan.MinY);
  356.          MySetContents(smodemoretext14, ESC "c%4d x %4d\n%4d x %4d\n%4d x %4d\n%4d x %4d\n%4d x %4d", idmntr.ViewPosition.x, idmntr.ViewPosition.y, idmntr.DefaultViewPosition.x, idmntr.DefaultViewPosition.y, idmntr.ViewResolution.x, idmntr.ViewResolution.y, idmntr.ViewPositionRange.MinX, idmntr.ViewPositionRange.MinY, idmntr.ViewPositionRange.MaxX, idmntr.ViewPositionRange.MaxY);
  357.          MySetContents(smodemoretext15, ESC "r$%08lx\n$%08lx", id, idmntr.PreferredModeID);
  358.          MySetContents(smodemoretext16, "%2d", idmntr.Compatibility);
  359.          MySetContents(smodemoretext18, ESC "r%d kHz\n%d Hz",fv/10,fh);
  360.          MySetContents(smodemoretext19, ESC "r%d\n%s",dep,colors);
  361.          MySetContents(smodemoretext20, ESC "r%d x %d", idmntr.MouseTicks.x, idmntr.MouseTicks.y);
  362.  
  363.          switch(idmntr.Compatibility)
  364.          {
  365.            case MCOMPAT_MIXED:
  366.               compathelp = "MCOMPAT_MIXED: can share display with other MIXED";
  367.               break;
  368.            case MCOMPAT_SELF:
  369.               compathelp = "MCOMPAT_SELF: can share only within monitor";
  370.               break;
  371.            case MCOMPAT_NOBODY:
  372.               compathelp = "MCOMPAT_NOBODY: only one viewport";
  373.               break;
  374.            default:
  375.               compathelp = ESC "8< ??? >";
  376.          }
  377.          MySetContents(smodemoretext17,"%s",compathelp);
  378.  
  379. //*         MySetContents (smodemoretext3, ESC "r$%08x\n" ESC "c%s\n%d\n" ESC "r$%08x\n$%08x", bc, GetCxNodeType(CxObjType((CxObj *)bc)),bc->mco_Node.ln_Pri, bc->mco_Task, bc->mco_Port);
  380. //*         MySetContentsHealed (cxmoretext5, "%s", nonetest (GetTaskName (bc->mco_Task)));
  381.  
  382.          HandleWindowOpen (ptr, title, sm->sme_name);
  383.          HandleWindowClose (ptr);
  384.       }
  385.    }
  386. }
  387.  
  388.